全域註冊
Vue.component('my-component', {
// 設定屬性、方法等
})
在初始化 Vue 的全域函數時,也定義了 Vue.component
// src/core/global-api/assets.js
import { ASSET_TYPES } from 'shared/constants'
import { isPlainObject, validateComponentName } from '../util/index'
export function initAssetRegisters (Vue: GlobalAPI) {
/******************************************
遍歷 ASSET_TYPES 把 type 掛載到 Vue 上
******************************************/
ASSET_TYPES.forEach(type => {
Vue[type] = function (
id: string,
definition: Function | Object
): Function | Object | void {
if (!definition) {
return this.options[type + 's'][id]
} else {
if (process.env.NODE_ENV !== 'production' && type === 'component') {
validateComponentName(id)
}
if (type === 'component' && isPlainObject(definition)) {
definition.name = definition.name || id
/**************************************************
如果 type 是 component 且 definition 是一個物件,
則執行 this.opitons._base.extend
**************************************************/
definition = this.options._base.extend(definition)
}
if (type === 'directive' && typeof definition === 'function') {
definition = { bind: definition, update: definition }
}
/**************************************************
掛載到 Vue.options.components 上
**************************************************/
this.options[type + 's'][id] = definition
return definition
}
}
})
}
// src/shared/constants.js
/******************************************
ASSET_TYPES 定義如下,Vue 初始化了 3 個全域函数
******************************************/
export const ASSET_TYPES = [
'component',
'directive',
'filter'
]
局部註冊
import HelloWorld from './components/HelloWorld'
export default {
components: {
HelloWorld
}
}
局部註冊是在元件的 Vue 實例化時有一段合併 option
的程式碼,把 components 合併到 vm.$options.components 上。